﻿using UnityEngine;
using System.Collections;

/// <summary>
/// 게임 카메라 컨트롤
/// </summary>
public class GameCamera : MonoBehaviour
{
	/// <summary>
	/// 캐릭터 추적 모드
	/// </summary>
	public enum FollowingMode
	{
		Character,		// 캐릭터를 계속 추척한다
		MapChunk,		// 맵 조각(화면) 단위로 따라간다

		None			// 추적하지 않음
	}

	// Properties

	[SerializeField]
	FollowingMode		m_followingMode;			// 카메라 추적 모드
	[SerializeField]
	int					m_screenWidth;
	[SerializeField]
	int					m_screenHeight;



	// Members

	Camera	m_camera;								// 카메라 레퍼런스
	Transform m_localT;


	public int screenWidth
	{
		get
		{
			return m_screenWidth;
		}
	}
	public int screenHeight
	{
		get
		{
			return m_screenHeight;
		}
	}

	public FollowingMode followingMode
	{
		get
		{
			return m_followingMode;
		}
		set
		{
			m_followingMode	= value;
		}
	}


	void Awake()
	{
		m_localT	= transform;
		m_camera	= camera;						// 카메라 레퍼런스 확보

		if(Camera.main != m_camera)					// 메인 카메라가 아닐 경우엔 경고
		{
			Debug.LogWarning("Camera component attached to GameCamera is not the main camera! this might be a source of malfunction.");
		}
	}

	void Update()
	{
		BaseCharacter mainChar	= GameScene.playerCharacter;
		if(mainChar != null)																// * 캐릭터가 null이 아니라면 카메라 좌표 계산 시작
		{
			World world			= GameScene.worldRoot;

			Vector3 camGamePos	= world.WorldToLocalPosition(m_localT.position);			// 카메라 위치를 게임월드 기준 좌표로 가지고있기
			float camXmin		= world.cameraXPosMin;
			float camXmax		= world.cameraXPosMax;
			float mainCharX		= mainChar.position.x;

			switch(m_followingMode)
			{
			case FollowingMode.Character:
				camGamePos.x	= Mathf.Clamp(mainCharX, camXmin, camXmax);					// 캐릭터의 X 좌표를 따라가되 화면 범위를 벗어나지 않게
				break;

			case FollowingMode.MapChunk:
				float charZeroX	= mainCharX + ((float)m_screenWidth / 2f);					// 캐릭터 X좌표, 시작점을 0점으로 계산
				float xByScreen	= Mathf.Floor(charZeroX / (float)m_screenWidth);			// 캐릭터가 몇번째 화면에 들어왔는지
				float realX		= xByScreen * m_screenWidth;								// 해당 화면 좌표를 구함
				camGamePos.x	= Mathf.Clamp(realX, camXmin, camXmax);
				break;
			}

			m_localT.position	= world.LocalToWorldPosition(camGamePos);					// 카메라 위치 업데이트
		}
	}
}
